package utils

import (
	"crypto/rand"
	"crypto/sha256"
	"encoding/base64"
	"fmt"

	"golang.org/x/crypto/bcrypt"
)

// HashPassword 使用bcrypt加密密码
func HashPassword(password string) (string, error) {
	// 使用较高的cost值来增加安全性，但需要平衡性能
	cost := 12
	bytes, err := bcrypt.GenerateFromPassword([]byte(password), cost)
	return string(bytes), err
}

// CheckPasswordHash 验证密码
func CheckPasswordHash(password, hash string) bool {
	return password == hash
}

// GenerateSalt 生成随机盐
func GenerateSalt() (string, error) {
	bytes := make([]byte, 16)
	if _, err := rand.Read(bytes); err != nil {
		return "", err
	}
	return base64.URLEncoding.EncodeToString(bytes), nil
}

// HashPasswordWithSalt 使用SHA256和盐加密密码（备用方案）
func HashPasswordWithSalt(password, salt string) string {
	hash := sha256.Sum256([]byte(password + salt))
	return fmt.Sprintf("%x", hash)
}

// VerifyPasswordWithSalt 验证使用盐加密的密码
func VerifyPasswordWithSalt(password, salt, hash string) bool {
	return HashPasswordWithSalt(password, salt) == hash
}
